package com.gsoe.base.Interface;

import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.stp.StpInterface;

import com.gsoe.base.client.UserClient;
import com.gsoe.base.exception.UserException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
@Slf4j
public class StpInterfaceImpl implements StpInterface {
    //获取用户角色信息 只需要查找数据库再将用户拥有的角色信息缓存，要修改时删除一个用户缓存即可
    //获取用户权限信息：先获取用户角色，再获取角色对应的权限 修改时删除角色缓存 而不是删用户缓存
    //原因：
    // 如果直接获取用户所拥有的所有权限，再缓存起来的话
    //当用户达到一定数量时，修改一个角色对应的权限，要将所有用户缓存清除
    //当用户都来获取权限时，容易导致缓存雪崩
    @Autowired
    UserClient userClient;

    @Override
    @SuppressWarnings("unchecked")
    public List<String> getPermissionList(Object o, String s) {
        List<String>permissionListTotal = new ArrayList<>();
        List<String> roleList = getRoleList(o, s);
        roleList.forEach(role ->{
            List<String> permissionListOne = (List<String>)SaManager.getSaTokenDao().getObject("satoken:role-find-permission:" + role);
            if(permissionListOne == null){
                //去数据库找，并缓存
                permissionListOne=userClient.getPowerListByRoleName(role).getData();
                log.info("--------权限数据-------{}",permissionListOne);
                SaManager.getSaTokenDao().setObject("satoken:role-find-permission:" + role, permissionListOne, 60 * 60 * 24 * 30);
            }
            permissionListTotal.addAll(permissionListOne);
        });
        return permissionListTotal;
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<String> getRoleList(Object o, String s) {
        List<String> roleList = (List<String>)SaManager.getSaTokenDao().getObject("satoken:loginId-find-role:" + o);
        if(roleList == null){
            //去数据库找，并缓存
            roleList=userClient.getRoleList(Long.valueOf((String) o));
            log.info("--------角色数据-------{}",roleList);
            SaManager.getSaTokenDao().setObject("satoken:loginId-find-role:" + o, roleList, 60 * 60 * 24 * 30);
        }
        return roleList;
    }
}
